package com.xiaobai.common.utils.config.page;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.github.pagehelper.PageHelper;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public class PageUtils {
    public PageUtils() {
    }

    public static void paging() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String pageNo = request.getParameter("page");
        String pageSize = request.getParameter("pageSize");
        if (StrUtil.isBlank(pageNo)) {
            pageNo = "1";
        }

        if (StrUtil.isBlank(pageSize)) {
            pageSize = "10";
        }

        int page = Integer.parseInt(pageNo);
        if (page <= 0) {
            page = Integer.parseInt("1");
        }

        int size = Integer.parseInt(pageSize);
        if (size <= 0 || size > 1000) {
            size = Integer.parseInt("10");
        }

        PageHelper.startPage(page, size);
    }

    public static <T> Page<T> createPage(List<T> list) {
        Page<T> data = new Page();
        data.setDatas(list);
        if (list instanceof com.github.pagehelper.Page) {
            com.github.pagehelper.Page page = (com.github.pagehelper.Page) list;
            data.setTotal(Long.valueOf(page.getTotal()).intValue());
            data.setPage(page.getPageNum());
            data.setPageSize(page.getPageSize());
        } else {
            data.setPageSize(list.size());
            data.setPage(1);
            data.setTotal(list.size());
        }

        return data;
    }

    public static <T, V> Page<V> createPage(List<T> list, Function<List<T>, List<V>> func) {
        Page<V> data = new Page();
        List<V> datas = (List) func.apply(list);
        data.setDatas(datas);
        if (list instanceof com.github.pagehelper.Page) {
            com.github.pagehelper.Page page = (com.github.pagehelper.Page) list;
            data.setTotal(Long.valueOf(page.getTotal()).intValue());
            data.setPage(page.getPageNum());
            data.setPageSize(page.getPageSize());
        } else {
            data.setPageSize(list.size());
            data.setPage(1);
            data.setTotal(list.size());
        }

        return data;
    }

    public static <T> Page<T> createPage(List<T> list, Integer pageIndex, Integer pageSize) {
        Page<T> page = new Page<>();
        page.setPageSize(pageSize);
        page.setPage(pageIndex);
        if (CollectionUtils.isNotEmpty(list)) {
            page.setTotal(list.size());
            List<T> list1;
            if (pageIndex * pageSize <= list.size()) {
                list1 = list.subList((pageIndex - 1) * pageSize, pageIndex * pageSize);
            } else if ((pageIndex - 1) * pageSize <= list.size()) {
                list1 = list.subList((pageIndex - 1) * pageSize, list.size());
            } else {
                list1 = new ArrayList<>();
            }

            page.setDatas(list1);
        }

        return page;
    }
}